package String;

/**
 * @author 孤雪唯方
 * @date 2025/05/19
 * @description 字符串常量池
 */
public class StringConstPool {

    public static void testIntern(){
        char[] chars1 = {'a', 'b', 'c'};
        String str1 = new String(chars1);
        //str1.intern();//将str1的引用放入字符串常量池中，此时str1和"abc"指向的是同一个字符串常量池中的对象，即"abc"
        String str2 = "abc";
        System.out.println(str1 == str2);//结果为false,当解除str1.intern()注释时，str1和str2指向的会是同一个字符串常量池中的对象，此时str1 == str2为true
    }

    public static void main(String[] args) {

        // 相同的字符串只会存在字符串常量池中一次，所以s1和s2指向的是同一个对象，即String常量池中的hello对象，其地址值是一样的
        String s1 = "hello";
        String s2 = "hello";
        // 不同字符串，创建新的对象
        String s3 = new String("hello");
        String s4 = "hello world";
        System.out.println(s1 == s2); // true
        System.out.println(s1 == s3); // false
        System.out.println(s1 == s4);//false
        // 修改s1的值与s4内容相同，此时常量池中已经存在"hello world"对象，所以s1会指向的是常量池中的"hello world"对象，s1中存储的地址值与s4中存储的地址值也会相同
        s1 = "hello world";
        System.out.println(s1 == s4);//true

        testIntern();
    }
}
